package cn.com.w.bootfreemarker.util;

import java.util.List;

public class ResultUnit<T> {

    /**
     * 成功描述
     */
    public static final String OK_MSG = "操作成功";

    /**
     * 成功代码
     */
    public static final Integer OK_CODE = 0;

    /**
     * 成功描述
     */
    public static final String ERROR_MSG = "操作失败";

    /**
     * 成功代码
     */
    public static final Integer ERROR_CODE = 1;

    /**
     * 结果code
     */
    public Integer code;

    /**
     * 结果消息
     */
    public String message;

    /**
     * 分页查询时数据总数
     */
    public Integer count;

    /**
     * 查询单个数据时
     */
    public T data;

    /**
     * 查询批量数据时
     */
    public List<T> datas;

    public ResultUnit(){};

    /**
     * 构造函数
     *
     * @param code    消息code
     * @param message 消息信息
     */
    public ResultUnit(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 通用成功
     *
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok() {
        return new ResultUnit(OK_CODE, OK_MSG);
    }

    /**
     * 自定义成功
     *
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok(int code, String message) {
        return new ResultUnit(code, message);
    }

    /**
     * 带有单个数据的通用成功
     *
     * @param data
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok(T data) {
        ResultUnit resultUnit = new ResultUnit(OK_CODE, OK_MSG);
        resultUnit.setData(data);
        return resultUnit;
    }

    /**
     * 带有单个数据的自定义成功
     *
     * @param data
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok(T data, int code, String message) {
        ResultUnit resultUnit = new ResultUnit(code, message);
        resultUnit.setData(data);
        return resultUnit;
    }

    /**
     * 分页查询数据通用成功
     *
     * @param datas
     * @param count
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok(List<T> datas, int count) {
        ResultUnit resultUnit = new ResultUnit(OK_CODE, OK_MSG);
        resultUnit.setDatas(datas);
        resultUnit.setCount(count);
        return resultUnit;
    }

    /**
     * 分页查询数据自定义成功
     *
     * @param datas
     * @param count
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> ok(List<T> datas, int count, int code, String message) {
        ResultUnit resultUnit = new ResultUnit(code, message);
        resultUnit.setDatas(datas);
        resultUnit.setCount(count);
        return resultUnit;
    }


    /**
     * 通用失败
     *
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> error() {
        return new ResultUnit(ERROR_CODE, ERROR_MSG);
    }

    /**
     * 自定义失败
     *
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> error(int code, String message) {
        return new ResultUnit(code, message);
    }

    /**
     * 带有数据的通用失败
     *
     * @param data
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> error(T data) {
        ResultUnit resultUnit = new ResultUnit(ERROR_CODE, ERROR_MSG);
        resultUnit.setData(data);
        return resultUnit;
    }

    /**
     * 带有数据的自定义失败
     *
     * @param data
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public <T> ResultUnit<T> error(T data, int code, String message) {
        ResultUnit resultUnit = new ResultUnit(code, message);
        resultUnit.setData(data);
        return resultUnit;
    }


    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public List<T> getDatas() {
        return datas;
    }

    public void setDatas(List<T> datas) {
        this.datas = datas;
    }
}
